写demo注意事项
1.写demo 一定不要每个demo里面写好几个 test1...testN  等
    类似的功能要写成两个demo  而不要  代码复用  方便日后查阅整理
2.写demo 尽量不要依赖非demo目的以外的 自定义框架 或者第三方框架 ， 比如写  rac的oc demo  就只允许引入 objcrac  而避免引入 afn等 不必要三方框架
3.oc 写得 demo 一定不要用  xib或者storyboard，因为以后复用可能比较麻烦

开发的时候的注意事项
本文主要针对 iOS  oc 开发的项目
说明：编码遵循简单，直观，清晰的原则，才能易读、易维护。最重要的是养成经常做注释的良好习惯。

一、 命名

1.1 常量：

　　可以写的比较随意，但是最好也用相应意思的英文来写，否则会很难读懂。

1.2 变量：

　　遵循驼峰命名法：首字母小写，以后每个单词的首字母大写

　　UI控件，我们就要以“功能”+“类型”来命名，言简意赅，一眼就能看出来他的功能 。 如“待办”的表格用 toDoTableView。

　　如果是约束，以Const尾缀，最好写A的属性 To B的属性命名，如果是宽度，可以很简单，如C的宽度 = CWidthConst

　　如果是定义成员变量，记得前面加个下划线（这里注意成员变量和类的属性的区别）

1.3 属性

　　修饰属性的关键字：

　　　　block,NSString用copy

　　　　基本数据类型用assign

　　　　UI控件如果不是懒加载用weak，如果是懒加载用strong

　　　　对象属性用strong

　　　　readOnly（只读不能修改，其实用KVC是可以赋值的）

1.4 方法名：

　　遵循驼峰命名法

　　避免方法的参数过多，一般最多为5个

　　如果方法有多个返回状态，建议用enum作为返回类型

　　方法名不要用缩写，尽量表达方法操作的意思

1.5 通知：

　　使用“项目前缀”+“发出通知的类”+“did/will”+“动作”+“Notification”

　　如：

　　　　UIKIT_EXTERN NSString *const UIWindowDidResignKeyNotification; // nil

　　　　NSString *const SHUserDidLoginNotification = @"SHUserDidLoginNotification";//自定义的通知

1.6 代理：

　　“项目前缀”+"类名"+“Delegate”

1.7 类：

　　以项目的前缀开头，以名词结尾

　　以类的作用+所属于的类型来命名

　　　　如：SHToDoCell, SHToDoController等

1.8 宏：
        a.全部用大写，多个单词用下划线分隔
        b.用小写“k”开头后面遵循驼峰命名法进行定义。

1.9 g_ 全局变量  s_ 静态变量

1.10 名字清楚简单，让人一目了然，尽量用英文命名名字有意义的通用词汇，名字最好尽可能精确表达其内容，不可以用拼音代替

1.11 避免用缩写，如果名字太长才在不引起歧义的前提下用缩写，当命名里出现缩写词时，缩写词全部大写

1.12 避免局部名和外层的名字冲突，避免方法里面的单词和参数名字相同

　　如  不可以写   -(void)showView:(UIView *)view name:(NSString*)name
            因为  view 和 self.view 容易让人混淆   两个name 重复了

　　　　可以写-(void)showView:(UIView *)outview viewName:(NSString*)name

1.13 文件名：

　　“项目前缀”+"行为/属性"+"类型"命名，如：SHHomeViewController  ZFoundTableViewCell

　　对于一个汉语有多个英文的名字要统一规定好，如交易就是transaction，说了就不要再用deal了

1.14 关于英语词性的选择（优秀的产品都应如此）：

　　类和对象名应是名词

　　实现行为的类成员函数名应是动词





二、注释：

2.1 每个类应该在头文件中写上注释，如：

/*****************************************/

//类的中文名称

//类的作用

//这个类在什么情况下将被调用

/*****************************************/



2.2 每个类的每个方法前面应该都应该有注释，如：

/*****************************************/

//函数的中文名称

//函数的详细说明

//重要参数说明

//返回值说明

//测试代码（如果需要则注释上，方便日后单元测试）

/*****************************************/



2.3 每次做了修改，应该按照如下格式作出说明（一般这个用得不多，因为有svn等代码管理工具，可以很轻易的看到哪里改了，还可以很容易的回滚。但是不得不说如果一个工程这么写的话，即使将工程单独拿出来，不依靠svn 也可以很容易的被开发者读懂，可维护性更强）

/*****************************************/

//类型：修改；修改人：某某某；日期：2012.1.1

//修改原因:XXXXXXX

/**************/

//原代码不要删除，方便改错后恢复

/**************/

/*****************************************/



2.4 方法中重要的逻辑和语句要作注释

2.5 类的变量，宏，常量，枚举等应该有所说明

　　如：此变量作用是什么

2.6 程序中要注意用#pragma mark -  或 //MARK:- 来对程序进行分块以及注释

2.7 添加有必要的注释，尽可能使用Xcode注释快捷键（⌘⌥/）

三、方法：

3.1 避免函数的参数过多，一般最多为5个

　　如果是参数大于等于3个的方法，要去折行

3.2 如果函数有多个返回状态，尝试用enum作为返回类型

3.3 规模不能太大，尽量控制在200行代码之内，重复使用的代码抽象成函数

3.4 空行的使用：

　　在操作符前后加空格

　　文件中的主要部分用空行分开

　　方法之间要用两个空行分开

　　用空行将代码按逻辑片断划分

　　理论上每一行不超过一屏幕

　　不要在一行中放多于一条语句

3.5 语句switch中的case按字母顺序排列

3.6 不可将布尔变量和逻辑表达式直接与YES、NO或者1、0进行比较。

　　如： 设bFlag 是布尔类型的变量 可以写

　　if (bFlag)    // 表示flag为真

　　if (!bFlag)   // 表示flag为假

　　不要写：

　　 if (bFlag == TRUE)

　　if (bFlag == 1)

　　if (bFlag == FALSE)

　　if (bFlag == 0)

3.7 不可将浮点变量用“==”或“!=”与任何数字比较。

说明：无论是float还是double类型的变量，都有精度限制。所以一定要避免将浮点变量用“==”或“!=”与数字比较，应该转化成“>=”或“<=”形式。

如：可以写

if ((fResult >= -EPSINON) && (fResult <= EPSINON))

不可以写： if (fResult == 0.0)

其中EPSINON是允许的误差（即精度）

3.8 优先考虑用代码代替xib，代码直观，且实现容易移植。xib和storyboard更耗费内存。但是swift中例外，因为苹果在swift中主推storyboard编程



四、类：

4.1 提高类内的聚合度

4.2 降低类间的耦合度

4.3 限制继承的层数，一般最大为5

4.4 尽量不要将基类（父类）强制转换成派生类（子类）

4.5 对于功能相似的两个类注意抽取出父类





swift代码：

从oc转swift  会有很多的需要注意的地方，如下



一、命名

　　参考上面oc的 命名。

二、注释

　　参考上面oc的 命名。

　　swift中不用  #pragma mark

　　而是使用 // MARK: -，按功能、协议、代理等分组

// MARK: - private

// MARK: - click

// MARK: - loadData
三、函数

　　在swift中 大家大多都叫函数了，不叫方法了

　　参考上面oc的 命名。

　　需要注意的是swift中：

　　判断语句不用加括号

　　　如：

　　if typeValue == 1 {
    　　}
　　在访问枚举类型时，使用更简洁的点语法

　　let color = UIColor.red
　　当对外接口不兼容时，使用@available(iOS x.0, *) 标明接口适配的起始系统版本号

　　@available(iOS 8.0, *)
　　func myFunction() {
    　　}
　　没条语句后面不要加分号
　　　bool类型命名时，使用is作为前缀　　var isMine: Bool = false

　　当函数的第一个参数构成整个语句的介词时（如，at, by, for, in, to, with 等），为第一个参数添加介词参数标签

　　func login(with username: String?, password: String?){
    
    　　}


　　可选类型拆包取值时，使用if let 判断

　　if let data = result.data {
    　　}
　　 多个可选类型拆包取值时，将多个if let 判断合并

　　if let name = person.name, let age = person.age {
    　　}
　　避免使用 as! 或 try!　　而是使用if let as？判断

　　if let name = person.name as? String {
    　　}
　　组和字典变量定义时需要标明泛型类型，并使用更简洁清晰的语法

　　　　var names: [String] = []

　　　　var values: [String: Int] = [:]

　　　　var person: [String: Any] = [:]

四、类

　　参考上面oc的 命名。





